package com.shuo.model;

/**
 * 编译完会有6个.class文件:
 * GameOuter$1.class, GameOuter$InnerNormalPrivate.class, GameOuter$InnerNormalPublic.class
 * GameOuter$InnerStaticPrivate.class, GameOuter$InnerStaticPublic.class, GameOuter.class
 */
public class GameOuter {
    private String name = "HearthStone";

    public void userInner() {
        InnerNormalPublic a1 = new InnerNormalPublic();
        InnerNormalPrivate a2 = new InnerNormalPrivate();
        InnerStaticPrivate a3 = new InnerStaticPrivate();
        InnerStaticPublic a4 = new InnerStaticPublic();
        a1.printName();
        a2.printName();
        a3.printName();
        a4.printName();
    }

    /**
     * 普通内部类完全依赖外围类，也就是没有外围类实例就不会有内部类实例，因此普通内部类不应该有静态成员
     */
    public class InnerNormalPublic {
        // public static int age = 1; // 普通内部类不能有静态成员

        public void printName() {
            System.out.println(name);
        }
    }

    private class InnerNormalPrivate {
        // public static int age = 1; // 普通内部类不能有静态成员

        public void printName() {
            System.out.println(name);
        }
    }

    /**
     * 加static就是为了让内部类和外部类隔离(无法访问外部类的非静态成员)
     */
    public static class InnerStaticPublic {
        public static int age = 1; // 静态内部类可以有静态成员

        public void printName() {
            // System.out.println(name); // 静态内部类无法访问name
        }
    }

    /**
     * 私有静态内部类比较实用, 首先静态属性能做到和外部类的所有field隔离, 私有又和类外隔离
     * 应用: 这个类是个独立的类, 但是我只想让GameOuter可以访问
     * 假设GamerOuter里面属性太多了, 有些属性本身业务上联系紧密, 于是就可以用静态内部类封装起来
     */
    private static class InnerStaticPrivate {
        public static int age = 1; // 静态内部类可以有静态成员

        public void printName() {
            // System.out.println(name); // 静态内部类无法访问name
        }
    }
}
